// controller 层，专注于业务逻辑
const moment = require('moment')
const md5 = require('md5')
// 加载数据库连接
const db = require('../db/mysqlDB')
const controller = {}

controller.index = (req, res) => {
    res.render('index.html', {
        user: req.session.user
    })
}

controller.login = (req, res) => {
    // 获取表单数据
    // 查询数据库账号密码
    // 发送响应
    let loginData = req.body

    loginData.password = md5(md5(loginData.password) + 'myitcast')

    let loginQuerySql = `SELECT * FROM users WHERE 
    email = ${db.escape(loginData.email)} 
    AND password = ${db.escape(loginData.password)}`

    db.query(loginQuerySql, function (err, user) {
        if (err) {
            return res.status(500).json({
                err_code: 500,
                message: '服务端错误'// 里面也有这个方法查看错误信息 err.message
            })
        }

        // 如果邮箱或者密码存在则正确 data.length 为 1  反之为 0，0 为 false, 1 为 true
        if (!user.length) {
            return res.status(200).json({
                err_code: 1,
                message: '邮箱或者密码错误'
            })
        }

        // 用户存在，登录成功，通过 session 记住状态
        req.session.user = user[0]

        return res.status(200).json({
            err_code: 0,
            message: 'ok'
        })
    })
}

controller.register = (req, res) => {
    // 1. 获取表单提交的数据 req.body
    // 2. 操作数据库
    //    判断改用户是否存在
    //    如果已存在，不允许注册
    //    如果不存在，注册新建用户
    // 3. 发送响应
    // 为了避免SQL注入攻击，需要转义用户提交的数据。可以使用db.escape() 或者 pool.escape()
    // 例如 let sql = 'SELECT * FROM users WHERE id = ' + db.escape(userId);

    // 获取表单数据
    let userData = req.body

    let querySql = `SELECT email, nickname FROM users WHERE 
    email = ${db.escape(userData.email)} 
    OR nickname = ${db.escape(userData.nickname)}`

    db.query(querySql, function (err, data) {
        if (err) {
            return res.status(500).json({
                err_code: 500,
                message: '服务端错误'
            })
        }
        // 如果邮箱存在则 data.length 为 1  反之为 0，0 为 false, 1 为 true
        if (data.length) {
            // 邮箱或者昵称已存在
            return res.status(200).json({
                err_code: 1,
                message: '邮箱或者账号已存在，请重试.'
            })
        }

        // 转化时间，存入数据库
        let createTime = moment(new Date()).format('YYYY-MM-DD HH:mm:ss')

        // 加密密码，用 MD5 加密
        userData.password = md5(md5(userData.password) + 'myitcast')

        // 把前台输入内容保存到数据库
        let insertSql = `INSERT INTO users (email, password, nickname, create_time) 
        VALUES (${db.escape(userData.email)}, ${db.escape(userData.password)}, 
        ${db.escape(userData.nickname)}, ${db.escape(createTime)})`

        db.query(insertSql, function (err, data) {
            if (err) {
                return res.status(500).json({
                    err_code: 500,
                    message: '服务端错误'
                })
            }

            // 注册成功，使用 session 记录用户登录状态
            req.session.user = userData

            return res.status(200).json({
                err_code: 0,
                message: 'ok'
            })
        })
    });
}

controller.logout = (req, res) => {
    // 清除登录状态
    req.session.user = null

    // 重定向到登录页
    res.redirect('/login')
}

controller.settings_profile = (req, res) => {
    res.render('./settings/profile.html', {
        user: req.session.user
    })
}

controller.settings_profile_post = (req, res) => {
    let profileData = req.body
    console.log(req.session.user.id)
    let id = req.session.user.id

    // 转化时间，存入数据库
    let modifyTime = moment(new Date()).format('YYYY-MM-DD HH:mm:ss')

    let profileSql = `UPDATE users SET nickname = ${db.escape(profileData.nickname)}, 
        bio = ${db.escape(profileData.bio)}, gender = ${db.escape(profileData.gender)}, 
        birthday = ${db.escape(profileData.birthday)}, 
        modify_time = ${db.escape(modifyTime)} WHERE id = ${db.escape(id)}`

    db.query(profileSql, function (err, data) {
        if (err) {
            return res.status(500).json({
                err_code: 500,
                message: '服务端错误' + err
            })
        }

        let profileQuerySql = `SELECT * FROM users WHERE id = ${db.escape(id)}`

        db.query(profileQuerySql, function (err, user) {
            if (err) {
                return res.status(500).json({
                    err_code: 500,
                    message: '服务端错误'// 里面也有这个方法查看错误信息 err.message
                })
            }

            // 编辑设置个人信息成功，使用 session 记录用户登录状态
            req.session.user = user[0]

            return res.status(200).json({
                err_code: 0,
                message: 'ok'
            })
        })
    })
}

controller.settings_admin = (req, res) => {
    res.render('./settings/admin.html', {
        user: req.session.user
    })
}

controller.settings_admin_post = (req, res) => {
    // 修改密码，先判断当前密码是否正确，
    // 判断输入的修改密码与确认密码是否一致
    // 最后把新密码更新到数据库

    let adminData = req.body
    let dbAdminUser = req.session.user
    let adminPassword = md5(md5(adminData.password) + 'myitcast')
    let qrPassword = md5(md5(adminData.qrPassword) + 'myitcast')

    if (dbAdminUser.password !== adminPassword) {
        return res.status(200).json({
            err_code: 200,
            message: '输入密码与数据库密码不一致'// 里面也有这个方法查看错误信息 err.message
        })
    }

    if (parseInt(adminData.newPassword) !== parseInt(adminData.qrPassword)) {
        return res.status(200).json({
            err_code: 200,
            message: '两次输入密码不一致'// 里面也有这个方法查看错误信息 err.message
        })
    }

    let adminSql = `UPDATE users SET password = ${db.escape(qrPassword)} WHERE id = ${db.escape(dbAdminUser.id)}`

        db.query(adminSql, function (err, data) {
            if (err) {
                return res.status(500).json({
                    err_code: 500,
                    message: '服务端错误' + err
                })
            }

            let adminQuerySql = `SELECT * FROM users WHERE id = ${db.escape(dbAdminUser.id)}`

            db.query(adminQuerySql, function (err, user) {
                if (err) {
                    return res.status(500).json({
                        err_code: 500,
                        message: '服务端错误'// 里面也有这个方法查看错误信息 err.message
                    })
                }
    
                // 编辑修改个人信息密码成功，使用 session 记录用户登录状态
                req.session.user = user[0]
    
                return res.status(200).json({
                    err_code: 0,
                    message: 'ok'
                })
            })
        })
}

controller.topic_new = (req, res) => {
    res.render('./topic/new.html', {
        user: req.session.user
    })
}

module.exports = controller
